package com.example.nio.filechannel;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author panghu
 * @version 1.0.0
 * @createTime 2023年08月06日 15:25:00
 * @Description
 */
public class Demo08 {

    public static void main(String[] args) throws IOException{
        //注意一定要是可写的，不然无法进行修改操作
        try(RandomAccessFile f = new RandomAccessFile("test.txt", "rw");
            FileChannel channel = f.getChannel()){

            //通过map方法映射文件的某一段内容，创建MappedByteBuffer对象
            //比如这里就是从第四个字节开始，映射10字节内容到内存中
            //注意这里需要使用MapMode.READ_WRITE模式，其他模式无法保存数据到文件
            MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 4, 4);

            System.out.println(buffer.getClass());

            //我们可以直接对在内存中的数据进行编辑，也就是编辑Buffer中的内容
            //todo 注意这里写入也是从pos位置开始的，默认是从0开始，相对于文件就是从第四个字节开始写
            //todo 注意我们只映射了10个字节，也就是写的内容不能超出10字节了
            System.out.println(buffer.capacity());
            buffer.put("yyds".getBytes());

            //编辑完成后，通过force方法将数据写回文件的映射区域
            buffer.force();

        }
    }

}
